=over

=item IO::Handle->input_record_separator( EXPR )

=item $INPUT_RECORD_SEPARATOR

=item $RS

=item $/
X<$/> X<$RS> X<$INPUT_RECORD_SEPARATOR>

The input record separator, newline by default.  This influences Perl's
idea of what a "line" is.  Works like B<awk>'s RS variable, including
treating empty lines as a terminator if set to the null string (an
empty line cannot contain any spaces or tabs).  You may set it to a
multi-character string to match a multi-character terminator, or to
C<undef> to read through the end of file.  Setting it to C<"\n\n">
means something slightly different than setting to C<"">, if the file
contains consecutive empty lines.  Setting to C<""> will treat two or
more consecutive empty lines as a single empty line.  Setting to
C<"\n\n"> will blindly assume that the next input character belongs to
the next paragraph, even if it's a newline.

    local $/;           # enable "slurp" mode
    local $_ = <FH>;    # whole file now here
    s/\n[ \t]+/ /g;

Remember: the value of C<$/> is a string, not a regex.  B<awk> has to
be better for something. :-)

Setting C<$/> to an empty string -- the so-called I<paragraph mode> -- merits
special attention.  When C<$/> is set to C<""> and the entire file is read in
with that setting, any sequence of one or more consecutive newlines at the
beginning of the file is discarded.  With the exception of the final record in
the file, each sequence of characters ending in two or more newlines is
treated as one record and is read in to end in exactly two newlines.  If the
last record in the file ends in zero or one consecutive newlines, that record
is read in with that number of newlines.  If the last record ends in two or
more consecutive newlines, it is read in with two newlines like all preceding
records.

Suppose we wrote the following string to a file:

    my $string = "\n\n\n";
    $string .= "alpha beta\ngamma delta\n\n\n";
    $string .= "epsilon zeta eta\n\n";
    $string .= "theta\n";

    my $file = 'simple_file.txt'; 
    open my $OUT, '>', $file or die;
    print $OUT $string;
    close $OUT or die;

Now we read that file in paragraph mode:

    local $/ = ""; # paragraph mode
    open my $IN, '<', $file or die;
    my @records = <$IN>;
    close $IN or die;

C<@records> will consist of these 3 strings:

    (
      "alpha beta\ngamma delta\n\n",
      "epsilon zeta eta\n\n",
      "theta\n",
    )

Setting C<$/> to a reference to an integer, scalar containing an
integer, or scalar that's convertible to an integer will attempt to
read records instead of lines, with the maximum record size being the
referenced integer number of characters.  So this:

    local $/ = \32768; # or \"32768", or \$var_containing_32768
    open my $fh, "<", $myfile or die $!;
    local $_ = <$fh>;

will read a record of no more than 32768 characters from $fh.  If you're
not reading from a record-oriented file (or your OS doesn't have
record-oriented files), then you'll likely get a full chunk of data
with every read.  If a record is larger than the record size you've
set, you'll get the record back in pieces.  Trying to set the record
size to zero or less is deprecated and will cause $/ to have the value
of "undef", which will cause reading in the (rest of the) whole file.

As of 5.19.9 setting C<$/> to any other form of reference will throw a
fatal exception. This is in preparation for supporting new ways to set
C<$/> in the future.

On VMS only, record reads bypass PerlIO layers and any associated
buffering, so you must not mix record and non-record reads on the
same filehandle.  Record mode mixes with line mode only when the
same buffering layer is in use for both modes.

You cannot call C<input_record_separator()> on a handle, only as a
static method.  See L<IO::Handle|IO::Handle>.

See also L<perlport/"Newlines">.  Also see L</$.>.

Mnemonic: / delimits line boundaries when quoting poetry.

=back